package com.jhs.boot.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jhs.boot.common.model.Option;
import com.jhs.boot.common.result.Result;
import com.jhs.boot.system.model.entity.SysNodes;
import com.jhs.boot.system.model.form.SysNodesForm;
import com.jhs.boot.system.model.query.SysNodesQuery;
import com.jhs.boot.system.model.vo.GraphNodeVO;
import com.jhs.boot.system.model.vo.NodesThirdVO;
import com.jhs.boot.system.model.vo.SysNodesVO;

import java.util.List;
import java.util.Set;

/**
 * 节点服务类
 *
 * @author zxy
 * @since 2025-08-11 19:17
 */
public interface SysNodesService extends IService<SysNodes> {

    /**
     *节点分页列表
     *
     * @return {@link IPage<SysNodesVO>} 节点分页列表
     */
    IPage<SysNodesVO> getSysNodesPage(SysNodesQuery queryParams);

    /**
     * 获取节点表单数据
     *
     * @param id 节点ID
     * @return 节点表单数据
     */
     SysNodesForm getSysNodesFormData(Long id);

    /**
     * 新增节点
     *
     * @param formData 节点表单对象
     * @return 是否新增成功
     */
    boolean saveSysNodes(SysNodesForm formData);

    /**
     * 修改节点
     *
     * @param id   节点ID
     * @param formData 节点表单对象
     * @return 是否修改成功
     */
    boolean updateSysNodes(Long id, SysNodesForm formData);

    /**
     * 删除节点
     *
     * @param ids 节点ID，多个以英文逗号(,)分割
     * @return 是否删除成功
     */
    boolean deleteSysNodess(String ids);

    /**
     * 获取节点列表
     * @return {@link List<Option<String>>} 节点选项列表
     */
    List<Option<String>> listNodesOptions();

    /**
     * 获取当前用户的节点拓扑图
     * @return
     */
    GraphNodeVO graphOptions();

    /**
     * 节点请求上线
     *
     * @param ip      IP地址
     * @param type    类型
     * @param mac     MAC地址
     * @param routeIp
     * @return 返回成功或者失败
     */
    boolean addNodeUp(String ip, Integer type, String mac, String routeIp);

    /**
     * 重启节点信息
     *
     * @param ip
     * @param type
     * @return 返回成功或者失败
     */
    boolean reboot(String ip, Integer type);

    /**
     * 获取所有的MPP MAP节点
     * @return
     */
    List<GraphNodeVO> getAllNodes();

    SysNodes  getSysNodesByType(Integer zero);

    List<Long> getSysNodesDept();

    /***
     * 获取节点下的配置
     * @param ip
     * @param cfgItem
     * @param type
     * @return
     */
    Result getConfig(String ip, String cfgItem, Integer type);

    /**
     * 修改节点的配置
     * @param nodesThirdVO
     * @return
     */
    boolean updateSet(NodesThirdVO nodesThirdVO);

    /**
     * 获取路由关系下拉列表
     *
     * @param onlyParent 是否只查询父级菜单
     */
    List<Option<Long>> listNodeOptions(boolean onlyParent);

    /**
     * 根据路由信息获取路由的节点
     * @param routeId
     * @return
     */
    List<SysNodes> getByRouteId(Long routeId);

    void loadDateToRedis(List<SysNodes> list);

    /**
     * 将节点的状态跟新
     * @param one 父节点
     * @param status 修改的子节点的状态
     */
    void updayeNodeAndRedis(SysNodes one,Integer status);

    /**
     * 根据条件更新redis和节点信息同步
     * @param one 跟新下发的节点
     * @param updateNextNode  下发节点的子节点
     */
    void upNoticeNodeAndRedisById(SysNodes one,Boolean updateNextNode,Integer statusNext);

    /**
     * 下线或者上线终端设备
     * @param sysNodes 父终端
     * @param keysChild 子终端
     * @param status 查询终端状态
     */
    void deviceUpdate(SysNodes sysNodes, Set<String> keysChild, Integer status);

    /**
     * 添加终端  type》1的
     *
     * @param nodesBean 子终端
     * @param sysNodes 父类终端
     */
    void saveTerminalNode( NodesThirdVO  nodesBean, SysNodes sysNodes);

    /**
     * 查询redis终端信息  如果没有更新终端
     *
     * @param nodeIp 子节点信息
     * @param sysNodes 父节点信息
     * @param status 要查询的状态
     */
    void updateTerminalNode(NodesThirdVO nodeIp, SysNodes sysNodes, Integer status);

    /**
     *      * 查询在线节点终端  让其下线
     *     @param key 终端的redis key
     *
     * @param o
     * @param sysNodes 父类节点
     * @param status 状态 0下线 1 在线
     */
    void updateNodeTermial(NodesThirdVO o, SysNodes sysNodes, String key, Integer status);
}
